package com.cskaoyan.charstream.code;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;

/*
      编解码：
        a. 只针对字符数据(字符串，文本数据), 其他数据类型的数据，没有编解码
        b. java语言中的编解码，针对的是String数据

       编码:
          String ——> byte[]

       解码：
         String 码值 byte[]  ——> String

       关于编解码操作的常识:
       a. 在UTF-8字符集中，中文字符的编码值，占三个字节
       b. 在GBK字符集中，中文字符的编码值，占两个字节

       在jdk中，如果我们程序员自己做 编解码，需要指定编解码所使用的字符集，但是如果在使用
       jdk中的方法编解码的时候，没有指定字符集, 那么jdk就会使用默认字符集
       a. 如果在IDEA中运行，因为IDEA做了设置，默认字符集 UTF-8
       b. 原生的java语言的运行环境，默认字符集是GBK
 */
public class Demo1 {

    public static void main(String[] args) throws UnsupportedEncodingException {
        // 编解码
        //encodeAnddecode();

        String s = "你好";
//        byte[] bytes = s.getBytes();
//        byte[] utf8Bytes = s.getBytes("utf-8");
//        System.out.println(Arrays.toString(bytes));
//        System.out.println(Arrays.toString(utf8Bytes));

        System.out.println(Charset.defaultCharset());

        // 如果使用不包含中文字符的字符集，可能发生乱码
        byte[] asciis = s.getBytes("ASCII");



    }

    private static void encodeAnddecode() throws UnsupportedEncodingException {
        //编码字符串
        String data ="你好";

        // 基于UTF-8编码
        byte[] utf8Bytes = data.getBytes("utf-8");
        //System.out.println(Arrays.toString(utf8Bytes));

        // 基于UTF-8字符集的解码
        // 如果解码字符集是GBK，编解码不一致: 浣犲ソ
        //String decodeStr = new String(utf8Bytes, 0, utf8Bytes.length, "utf-8");
        //System.out.println(decodeStr);


        // 基于GBK编码
        byte[] gbkBytes = data.getBytes("gbk");
        System.out.println(Arrays.toString(gbkBytes));

        // 基于GBK解码
        // 如果基于utf-8编解码不一致：���
        String gbkStr = new String(gbkBytes, 0, gbkBytes.length, "utf-8");
        System.out.println(gbkStr);

    }
}
